/**
 * WMS通用组件类型定义
 *
 * 定义所有通用组件的接口、类型和常量
 * 确保类型安全和开发体验
 */

import type { CSSProperties } from "vue";

/**
 * 基础组件属性接口
 */
export interface WmsBaseComponentProps {
  /** 组件唯一标识 */
  id?: string | number;
  /** 自定义CSS类名 */
  className?: string;
  /** 内联样式 */
  style?: CSSProperties;
  /** 组件是否可见 */
  visible?: boolean;
  /** 组件是否禁用 */
  disabled?: boolean;
  /** 组件尺寸 */
  size?: "large" | "default" | "small";
}

/**
 * 加载状态接口
 */
export interface WmsLoadingProps {
  /** 是否显示加载状态 */
  loading?: boolean;
  /** 加载提示文本 */
  loadingText?: string;
  /** 加载图标 */
  loadingIcon?: string;
}

/**
 * 事件处理接口
 */
export interface WmsEventHandlers<T = any> {
  /** 变更事件 */
  onChange?: (value: T) => void;
  /** 选择事件 */
  onSelect?: (item: T) => void;
  /** 点击事件 */
  onClick?: (event: MouseEvent) => void;
  /** 确认事件 */
  onConfirm?: (data: T) => void;
  /** 取消事件 */
  onCancel?: () => void;
  /** 重置事件 */
  onReset?: () => void;
}

/**
 * 分页配置类型
 */
export interface WmsPaginationConfig {
  /** 当前页码 */
  page: number;
  /** 每页条数 */
  limit: number;
  /** 总记录数 */
  total?: number;
  /** 每页显示个数选择器的选项设置 */
  pageSizes?: number[];
  /** 组件布局 */
  layout?: string;
  /** 是否为分页按钮添加背景色 */
  background?: boolean;
  /** 是否使用小型分页样式 */
  small?: boolean;
  /** 是否自动滚动到顶部 */
  autoScroll?: boolean;
}

/**
 * 表格列配置类型
 */
export interface WmsTableColumn<T = any> {
  /** 列属性名 */
  prop: keyof T | string;
  /** 列标题 */
  label: string;
  /** 列宽度 */
  width?: string | number;
  /** 最小列宽 */
  minWidth?: string | number;
  /** 列固定 */
  fixed?: boolean | "left" | "right";
  /** 对齐方式 */
  align?: "left" | "center" | "right";
  /** 是否排序 */
  sortable?: boolean | "custom";
  /** 排序方法 */
  sortMethod?: (a: T, b: T) => number;
  /** 排序字段 */
  sortBy?: string | string[] | ((row: T, index: number) => string);
  /** 排序顺序 */
  sortOrders?: ("ascending" | "descending")[];
  /** 是否可调整列宽 */
  resizable?: boolean;
  /** 是否显示溢出提示 */
  showOverflowTooltip?: boolean;
  /** 列样式类名 */
  className?: string;
  /** 表头样式类名 */
  labelClassName?: string;
  /** 格式化函数 */
  formatter?: (
    row: T,
    column: WmsTableColumn<T>,
    cellValue: any,
    index: number,
  ) => string;
  /** 自定义插槽名称 */
  slot?: string;
  /** 表头插槽名称 */
  headerSlot?: string;
  /** 字典类型 */
  dictType?: string;
  /** 是否可筛选 */
  filterable?: boolean;
  /** 筛选选项 */
  filters?: Array<{ text: string; value: any }>;
  /** 筛选方法 */
  filterMethod?: (value: any, row: T, column: WmsTableColumn<T>) => boolean;
}

/**
 * 表格操作按钮配置类型
 */
export interface WmsTableAction<T = any> {
  /** 操作类型(唯一标识) */
  type: string;
  /** 按钮文本 */
  label: string;
  /** 按钮类型 */
  buttonType?: "primary" | "success" | "warning" | "danger" | "info";
  /** 图标 */
  icon?: string;
  /** 权限标识 */
  permission?: string | string[];
  /** 是否显示 */
  show?: boolean | ((row: T, index: number) => boolean);
  /** 是否禁用 */
  disabled?: boolean | ((row: T, index: number) => boolean);
  /** 是否朴素按钮 */
  plain?: boolean;
  /** 是否圆角按钮 */
  round?: boolean;
  /** 是否圆形按钮 */
  circle?: boolean;
  /** 是否加载中 */
  loading?: boolean;
  /** 是否链接按钮 */
  link?: boolean;
  /** 是否文字按钮 */
  text?: boolean;
  /** 自定义样式类 */
  className?: string;
  /** 是否放入更多菜单 */
  more?: boolean;
  /** 下拉菜单项分割线 */
  divided?: boolean;
  /** 确认对话框配置 */
  confirm?: WmsConfirmConfig;
  /** 操作前置钩子 */
  beforeAction?: (row: T, index: number) => boolean | Promise<boolean>;
}

/**
 * 确认对话框配置类型
 */
export interface WmsConfirmConfig {
  /** 对话框标题 */
  title?: string;
  /** 确认消息 */
  message: string;
  /** 对话框类型 */
  type?: "warning" | "info" | "success" | "error";
  /** 确认按钮文本 */
  confirmButtonText?: string;
  /** 取消按钮文本 */
  cancelButtonText?: string;
  /** 是否居中显示 */
  center?: boolean;
}

/**
 * 状态标签配置类型
 */
export interface WmsStatusConfig {
  /** 显示文本 */
  text: string;
  /** 标签类型 */
  type: "primary" | "success" | "info" | "warning" | "danger";
  /** 图标 */
  icon?: string;
  /** 自定义颜色 */
  color?: string;
  /** 描述信息 */
  description?: string;
}

/**
 * 状态字典类型
 */
export type WmsStatusDictionary = Record<string | number, WmsStatusConfig>;

/**
 * 搜索条件类型
 */
export interface WmsSearchParams {
  /** 关键词 */
  keyword?: string;
  /** 状态 */
  status?: string | number;
  /** 创建时间范围 */
  createTimeRange?: [string, string] | null;
  /** 更新时间范围 */
  updateTimeRange?: [string, string] | null;
  /** 分页参数 */
  pageNum?: number;
  /** 每页数量 */
  pageSize?: number;
  /** 排序字段 */
  orderBy?: string;
  /** 排序方向 */
  orderDirection?: "asc" | "desc";
}

/**
 * API响应数据类型
 */
export interface WmsApiResponse<T = any> {
  /** 响应码 */
  code: number;
  /** 响应消息 */
  message: string;
  /** 响应数据 */
  data: T;
  /** 是否成功 */
  success: boolean;
  /** 时间戳 */
  timestamp: number;
}

/**
 * 分页响应数据类型
 */
export interface WmsPageResponse<T = any> {
  /** 数据列表 */
  records: T[];
  /** 总记录数 */
  total: number;
  /** 当前页码 */
  current: number;
  /** 每页大小 */
  size: number;
  /** 总页数 */
  pages: number;
  /** 是否有下一页 */
  hasNext: boolean;
  /** 是否有上一页 */
  hasPrevious: boolean;
}

/**
 * 表单验证规则类型
 */
export interface WmsFormRule {
  /** 是否必填 */
  required?: boolean;
  /** 错误消息 */
  message?: string;
  /** 验证触发方式 */
  trigger?: "blur" | "change" | "submit";
  /** 数据类型 */
  type?:
    | "string"
    | "number"
    | "boolean"
    | "method"
    | "regexp"
    | "integer"
    | "float"
    | "array"
    | "object"
    | "enum"
    | "date"
    | "url"
    | "hex"
    | "email";
  /** 最小长度/值 */
  min?: number;
  /** 最大长度/值 */
  max?: number;
  /** 正则表达式 */
  pattern?: RegExp;
  /** 自定义验证函数 */
  validator?: (
    rule: WmsFormRule,
    value: any,
    callback: (error?: Error) => void,
  ) => void;
  /** 转换函数 */
  transform?: (value: any) => any;
}

/**
 * 表单验证规则集合类型
 */
export type WmsFormRules = Record<string, WmsFormRule | WmsFormRule[]>;

/**
 * 表单字段配置类型
 */
export interface WmsFormField {
  /** 字段名 */
  prop: string;
  /** 字段标签 */
  label: string;
  /** 字段类型 */
  type:
    | "input"
    | "textarea"
    | "select"
    | "checkbox"
    | "radio"
    | "date"
    | "datetime"
    | "time"
    | "number"
    | "switch"
    | "upload"
    | "custom";
  /** 默认值 */
  defaultValue?: any;
  /** 占位符 */
  placeholder?: string;
  /** 是否必填 */
  required?: boolean;
  /** 是否禁用 */
  disabled?: boolean;
  /** 是否只读 */
  readonly?: boolean;
  /** 验证规则 */
  rules?: WmsFormRule[];
  /** 选项列表(用于select、radio、checkbox) */
  options?: Array<{ label: string; value: any; disabled?: boolean }>;
  /** 自定义插槽名称 */
  slot?: string;
  /** 字段提示信息 */
  tooltip?: string;
  /** 栅格布局配置 */
  col?: {
    span?: number;
    offset?: number;
    push?: number;
    pull?: number;
  };
}

/**
 * 导出导入配置类型
 */
export interface WmsExportImportConfig {
  /** 文件类型 */
  fileType: "excel" | "csv" | "pdf";
  /** 文件名前缀 */
  filename?: string;
  /** 导出字段配置 */
  fields?: Array<{
    prop: string;
    label: string;
    width?: number;
    formatter?: (value: any, row: any) => string;
  }>;
  /** 是否包含表头 */
  includeHeader?: boolean;
  /** 模板下载地址 */
  templateUrl?: string;
}

/**
 * 权限控制类型
 */
export interface WmsPermissionConfig {
  /** 权限标识 */
  permission: string | string[];
  /** 角色标识 */
  role?: string | string[];
  /** 权限验证函数 */
  validator?: () => boolean;
}

/**
 * 主题配置类型
 */
export interface WmsThemeConfig {
  /** 主题名称 */
  name: string;
  /** 主色调 */
  primaryColor: string;
  /** 成功色 */
  successColor: string;
  /** 警告色 */
  warningColor: string;
  /** 危险色 */
  dangerColor: string;
  /** 信息色 */
  infoColor: string;
  /** 背景色 */
  backgroundColor: string;
  /** 文本色 */
  textColor: string;
  /** 边框色 */
  borderColor: string;
  /** 字体大小 */
  fontSize: {
    small: string;
    medium: string;
    large: string;
    xlarge: string;
  };
  /** 间距配置 */
  spacing: {
    xs: string;
    sm: string;
    md: string;
    lg: string;
    xl: string;
  };
}
